package class_code.obj_3_Abstract;

/**
 * 声明抽象方法会造成以下两个结果：
 * <p>
 * 如果一个类包含抽象方法，那么该类必须是抽象类。
 * 任何子类必须重写父类的抽象方法，或者声明自身为抽象类。
 */

/**
 * 抽象类总结规定
 * 1. 抽象类不能被实例化(初学者很容易犯的错)，如果被实例化，就会报错，编译无法通过。只有抽象类的非抽象子类可以创建对象。
 * <p>
 * 2. 抽象类中不一定包含抽象方法，但是有抽象方法的类必定是抽象类。
 * <p>
 * 3. 抽象类中的抽象方法只是声明，不包含方法体，就是不给出方法的具体实现也就是方法的具体功能。
 * <p>
 * 4. 构造方法，类方法（用 static 修饰的方法）不能声明为抽象方法。
 * <p>
 * 5. 抽象类的子类必须给出抽象类中的抽象方法的具体实现，除非该子类也是抽象类。
 */

abstract class Car {
    String name;
    int level;

    abstract void go();

    abstract void back();

    abstract void stop();

    abstract void tranfer_add();

    abstract void tranfer_sub();


}

class SedanCar extends Car {
    String name = "剁椒鱼头";

    void go() {
        System.out.println(this.name + ",前进中");
    }


    void back() {
        System.out.println(this.name + ",后退中");
    }

    void stop() {
        System.out.println(this.name + ",停车了");
    }

    void tranfer_add() {
        this.level += 1;
        System.out.println("档位提高1，现在档位是:" + this.level);
    }

    void tranfer_sub() {
        this.level -= 1;
        System.out.println("档位减少1，现在档位是:" + this.level);

    }

    public static void main(String[] args) {
        SedanCar sedanCar = new SedanCar();

        sedanCar.go();
        sedanCar.tranfer_add();
        sedanCar.tranfer_add();
        sedanCar.tranfer_sub();
        sedanCar.tranfer_sub();
        sedanCar.stop();
    }
}
